package com.szxy.reflect;

import com.szxy.bean.Employee;

import java.lang.reflect.Field;

/**
 * @Author:zwer
 * @Date:2020/4/14 15:54
 * @Description:com.szxy.reflect
 * @Version:1.0
 **/
public class ReflectTest {

    /**
     * 测试
     * @param args
     */
    public static void main(String[] args) throws Exception {
        getEmployeeObjectAndSetId();
    }

    /**
     * 反射获取类对象的四种方式
     * @throws ClassNotFoundException
     */
    public static void getClassObject() throws ClassNotFoundException {
        // 1.  类名.class
        Class<Employee> clz = Employee.class;
        // 2. 对象名.getClass() ，注意： getClass() 方法属于 Object 类
        Employee emp = new Employee();
        Class<? extends Employee> clz2 = emp.getClass();
        // 3. Class.forName("全限定路径名")
        Class<?> clz3 = Class.forName("com.szxy.bean.Employee");
        // 4. 通过类加载器对象.loadClass("全限定路径名")
        ClassLoader classLoader = clz.getClassLoader();
        Class<?> clz4 = classLoader.loadClass("com.szxy.bean.Employee");

        System.out.println(clz == clz2);
        System.out.println(clz2 == clz3);
        System.out.println(clz3 == clz4);
        System.out.println("classLoader = " + classLoader);
    }

    /**
     *  通过反射方式，获取 Employee 类的对象以及给 id 属性赋值
     */
    public static void getEmployeeObjectAndSetId() throws Exception {
        Class<Employee> clz = Employee.class;
        // 通过反射方式，创建 Employee 对象
        Employee emp = clz.newInstance();
        // 获取 id 属性的 Field 类对象
        Field id = clz.getDeclaredField("id");
        // 设置可见性，访问类的私有属性
        id.setAccessible(true);
        // 给 emp 对象的 id 属性赋值
        id.set(emp, 1001);
        // 打印 id
        System.out.println("emp = " + emp);
    }
}


